"""
扩展:
    长连接和短连接
    短连接：上午的程序是一个短连接，客户端与服务端只交互了一次，然后socket对象就销毁了
    长连接：客户端和服务器端能够多次交互，可以手动选择在合适的时机关闭（释放）连接，一般适用于：数据库的连接
"""
# 需求：演示长连接，即：客户端不断地向服务器端发送消息，服务器端不断返回消息并打印，客户端发送886结束发送，关闭连接
# 当前代码为：服务器端的代码
import socket

# 1：创建服务器端的socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2：绑定ip和端口号
server_socket.bind(('192.168.40.56', 12307))
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

# 3：设置最大的监听数（设置5， 1-128，允许挂载，挂起的数量）
server_socket.listen(30)
print('服务器启动成功')

while True:
    # 4：具体的监听动作，接收客户端请求，并获取1个socket对象，负责和该客户端进行交互
    client_socket, client_addr = server_socket.accept()
    print('客户端连接成功')
    print(f'客户端地址：{client_addr}')

    while True:
        # 5：给客户端发送一句话，二进制形式
        # client_socket.send(b'Welcome to study socket!')

        # 6：接收客户端发过来的回执信息（二进制格式），需要解码为字符串。
        # 1024表示一次性接收客户端发送的数据的长度（单位：字节），超出则无法接收
        recv_data_bytes = client_socket.recv(1024)
        recv_data_str = recv_data_bytes.decode('utf-8')
        print(f'服务器端接收到的客户端:{client_addr}，回执信息：{recv_data_str}')

        # 7：判断是否接收到886，如果886，则结束循环，并关闭socket
        if recv_data_str == '886':
            # 7：释放资源，关闭socket
            client_socket.close()  # 和客户端交互的socket，一般要关闭
            break

# server_socket.close() # 服务器端一般不需要关闭